#!/usr/bin/env bash
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x

fn-get-pagesize() {
  declare desc="return the underlying system's memory page size"
  declare todo="port to common functions"

  "$PLUGIN_CORE_AVAILABLE_PATH/nginx-vhosts/pagesize"
}

fn-openresty-access-log-format() {
  declare desc="get the configured access log format"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "access-log-format" ""
}

fn-openresty-access-log-path() {
  declare desc="get the configured access log path"
  declare APP="$1"
  local OPENRESTY_LOG_ROOT="$(fn-openresty-log-root)"

  fn-plugin-property-get-default "openresty" "$APP" "access-log-path" "${OPENRESTY_LOG_ROOT}/${APP}-access.log"
}

fn-openresty-allowed-letsencrypt-domains-func-base64() {
  declare desc="get the configured allowed domains func base64"

  fn-plugin-property-get-default "openresty" "--global" "allowed-letsencrypt-domains-func-base64" "return true" | base64 -w 0
}

fn-openresty-bind-address-ipv4() {
  declare desc="get the configured ipv4 bind address"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "bind-address-ipv4" ""
}

fn-openresty-bind-address-ipv6() {
  declare desc="get the configured ipv6 bind address"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "bind-address-ipv6" "::"
}

fn-openresty-client-max-body-size() {
  declare desc="get the configured client max body size"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "client-max-body-size" ""
}

fn-openresty-error-log-path() {
  declare desc="get the configured error log path"
  declare APP="$1"
  local OPENRESTY_LOG_ROOT="$(fn-openresty-log-root)"

  fn-plugin-property-get-default "openresty" "$APP" "error-log-path" "${OPENRESTY_LOG_ROOT}/${APP}-error.log"
}

fn-openresty-get-http-includes-dir() {
  declare desc="get any include dir if available"
  declare APP="$1"

  if [[ -d "${DOKKU_LIB_ROOT}/data/openresty-vhosts/app-$APP/openresty-http-includes.$DOKKU_PID.missing" ]]; then
    return
  fi

  if [[ -d "${DOKKU_LIB_ROOT}/data/openresty-vhosts/app-$APP/openresty-http-includes.$DOKKU_PID" ]]; then
    echo "${DOKKU_LIB_ROOT}/data/openresty-vhosts/app-$APP/openresty-http-includes.$DOKKU_PID"
  elif [[ -d "${DOKKU_LIB_ROOT}/data/openresty-vhosts/app-$APP/openresty-http-includes" ]]; then
    echo "${DOKKU_LIB_ROOT}/data/openresty-vhosts/app-$APP/openresty-http-includes"
  fi
}

fn-openresty-get-location-includes-dir() {
  declare desc="get any include dir if available"
  declare APP="$1"

  if [[ -d "${DOKKU_LIB_ROOT}/data/openresty-vhosts/app-$APP/openresty-location-includes.$DOKKU_PID.missing" ]]; then
    return
  fi

  if [[ -d "${DOKKU_LIB_ROOT}/data/openresty-vhosts/app-$APP/openresty-location-includes.$DOKKU_PID" ]]; then
    echo "${DOKKU_LIB_ROOT}/data/openresty-vhosts/app-$APP/openresty-location-includes.$DOKKU_PID"
  elif [[ -d "${DOKKU_LIB_ROOT}/data/openresty-vhosts/app-$APP/openresty-location-includes" ]]; then
    echo "${DOKKU_LIB_ROOT}/data/openresty-vhosts/app-$APP/openresty-location-includes"
  fi
}

fn-openresty-hsts-include-subdomains() {
  declare APP="$1"
  fn-plugin-property-get-default "openresty" "$APP" "hsts-include-subdomains" "true"
}

fn-openresty-hsts-max-age() {
  declare APP="$1"
  fn-plugin-property-get-default "openresty" "$APP" "hsts-max-age" "15724800"
}

fn-openresty-hsts-preload() {
  declare APP="$1"
  fn-plugin-property-get-default "openresty" "$APP" "hsts-preload" "false"
}

fn-openresty-hsts-is-enabled() {
  declare APP="$1"
  local hsts_is_enabled="$(fn-plugin-property-get-default "openresty" "$APP" "hsts" "")"

  if [[ "$hsts_is_enabled" == "" ]]; then
    hsts_is_enabled="$(fn-plugin-property-get-default "openresty" "--global" "hsts" "true")"
  fi

  echo "$hsts_is_enabled"
}

fn-openresty-image() {
  fn-plugin-property-get-default "openresty" "--global" "image" "$(grep "FROM" "$PLUGIN_AVAILABLE_PATH/openresty-vhosts/Dockerfile" | awk '{print $2}')"
}

fn-openresty-letsencrypt-email() {
  fn-plugin-property-get-default "openresty" "--global" "letsencrypt-email" ""
}

fn-openresty-letsencrypt-server() {
  fn-plugin-property-get-default "openresty" "--global" "letsencrypt-server" "https://acme-v02.api.letsencrypt.org/directory"
}

fn-openresty-log-root() {
  declare desc="get the openresty log root"
  local OPENRESTY_LOG_ROOT="/var/log/nginx"
  echo "$OPENRESTY_LOG_ROOT"
}

fn-openresty-logs() {
  declare desc="shows the logs for the openresty container"
  declare TAIL="$1" NUM="$2"
  local dokku_logs_args=("--tail" "$NUM")

  if [[ "$TAIL" == "true" ]]; then
    dokku_logs_args+=("--follow")
  fi

  "$DOCKER_BIN" logs openresty-openresty-1 "${dokku_logs_args[@]}"
}

fn-openresty-logs-usage() {
  declare desc="logs specific usage"
  echo "Usage: dokku openresty:logs"
  echo " display recent openresty log output"
  echo ""
  echo " -n, --num NUM        # the number of lines to display"
  echo " -t, --tail           # continually stream logs"
}

fn-openresty-proxy-buffer-size() {
  declare desc="get the configured proxy buffer size"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "proxy-buffer-size" "$(fn-get-pagesize)k"
}

fn-openresty-proxy-buffering() {
  declare desc="get the configured proxy buffering"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "proxy-buffering" "on"
}

fn-openresty-proxy-buffers() {
  declare desc="get the configured proxy buffers"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "proxy-buffers" "8 $(fn-get-pagesize)k"
}

fn-openresty-proxy-busy-buffers-size() {
  declare desc="get the configured proxy busy buffers size"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "proxy-busy-buffers-size" "$(($(fn-get-pagesize) * 2))k"
}

fn-openresty-proxy-connect-timeout() {
  declare desc="get the configured proxy connect timeout"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "proxy-connect-timeout" "60s"
}

fn-openresty-proxy-read-timeout() {
  declare desc="get the configured proxy read timeout"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "proxy-read-timeout" "60s"
}

fn-openresty-proxy-send-timeout() {
  declare desc="get the configured proxy send timeout"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "proxy-send-timeout" "60s"
}

fn-openresty-send-timeout() {
  declare desc="get the configured proxy send timeout"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "send-timeout" "60s"
}

fn-openresty-template-compose-file() {
  declare desc="templates out the compose file"
  declare OUTPUT_PATH="$1"
  local COMPOSE_TEMPLATE="$PLUGIN_AVAILABLE_PATH/openresty-vhosts/templates/compose.yml.sigil"

  CUSTOM_COMPOSE_TEMPLATE="$(plugn trigger openresty-template-source "$APP")"
  if [[ -n "$CUSTOM_COMPOSE_TEMPLATE" ]]; then
    COMPOSE_TEMPLATE="$CUSTOM_COMPOSE_TEMPLATE"
  fi

  local SIGIL_PARAMS=(OPENRESTY_DATA_DIR="${DOKKU_LIB_ROOT}/data/openresty-vhosts/.docker-letsencrypt"
    OPENRESTY_IMAGE="$(fn-openresty-image)"
    OPENRESTY_LETSENCRYPT_EMAIL="$(fn-openresty-letsencrypt-email)"
    OPENRESTY_LETSENCRYPT_SERVER="$(fn-openresty-letsencrypt-server)")

  local ALLOWED_DOMAINS_FUNC_BASE64="$(fn-fn-openresty-allowed-letsencrypt-domains-func-base64)"
  if [[ -n "$ALLOWED_DOMAINS_FUNC_BASE64" ]]; then
    SIGIL_PARAMS+=(ALLOWED_DOMAINS_FUNC_BASE64="$ALLOWED_DOMAINS_FUNC_BASE64")
  fi

  sigil -f "$COMPOSE_TEMPLATE" "${SIGIL_PARAMS[@]}" | cat -s >"$OUTPUT_PATH"
}

fn-openresty-underscore-in-headers() {
  declare desc="get the configured underscore in headers value"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "underscore-in-headers" "off"
}

fn-openresty-x-forwarded-for-value() {
  declare desc="get the configured x-forwarded-for value"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "x-forwarded-for-value" "\$remote_addr"
}

fn-openresty-x-forwarded-port-value() {
  declare desc="get the configured x-forwarded-port value"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "x-forwarded-port-value" "\$server_port"
}

fn-openresty-x-forwarded-proto-value() {
  declare desc="get the configured x-forwarded-proto value"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "x-forwarded-proto-value" "\$scheme"
}

fn-openresty-x-forwarded-ssl() {
  declare desc="get the configured x-forwarded-ssl value"
  declare APP="$1"

  fn-plugin-property-get-default "openresty" "$APP" "x-forwarded-ssl" ""
}
